﻿#include "mainwindow.h"
#include "scribblearea.h"
#include "ui_mainwindow.h"

#include <QCloseEvent>
#include <QColorDialog>
#include <QFileDialog>
#include <QImageWriter>
#include <QInputDialog>
#include <QMessageBox>
#include <QDebug>

#pragma execution_character_set("utf-8")

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    scribbleArea = new ScribbleArea;
    setCentralWidget(scribbleArea);

    createActions();
    createMenus();

    setWindowTitle(tr("Scribble"));

    resize(500,500);

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::showMousePos()
{
    qDebug() << QString("无参");
}

void MainWindow::showMousePos(QPoint pos)
{
     qDebug() << QString("传参：") << pos;
}

void MainWindow::closeEvent(QCloseEvent *event)
{
    if(maybeSave())
    {
        event->accept();
    }
    else {
        event->ignore();
    }
}

void MainWindow::open()
{
    if(maybeSave())
    {
        QString fileName = QFileDialog::getOpenFileName(this,tr("Open File"),QDir::currentPath());

        if(!fileName.isEmpty())
        {
            scribbleArea->openImage(fileName);
        }
    }
}

void MainWindow::save()
{
    QAction *act = qobject_cast<QAction*>(sender());

    QByteArray fileFormat = act->data().toByteArray();

    saveFile(fileFormat);
}

void MainWindow::penColor()
{
    QColor newColor = QColorDialog::getColor(scribbleArea->penColor());
    if(newColor.isValid())
    {
        scribbleArea->setPenColor(newColor);
    }
}

void MainWindow::penWidth()
{
    bool ok;

//    int newWidth = QInputDialog::getInit(this,
//                                         tr("Scribble"),
//                                         tr("Select pen width:"),
//                                         scribbleArea->penWidth(),
//                                         1,50,1,&ok);
    int newWidth = QInputDialog::getInt(this, tr("Scribble"),
                                            tr("Select pen width:"),
                                            scribbleArea->penWidth(),
                                            1, 50, 1, &ok);
    if(ok)
    {
        scribbleArea->setPenWidth(newWidth);
    }
}

void MainWindow::about()
{
    QMessageBox::about(this,tr("About Acribble"),tr("<p>The <b>Scribble</b> example is awesome</p>"));
}



void MainWindow::createActions()
{
    openAct = new QAction(tr("&Open..."),this);

    openAct->setShortcuts(QKeySequence::Open);

    connect(openAct,SIGNAL(triggered()),this,SLOT(open()));

    foreach(QByteArray format, QImageWriter::supportedImageFormats())
    {
        QString text = tr("%1...").arg(QString(format).toUpper());

        QAction *act = new QAction(text,this);

        act->setData(format);

        connect(act,SIGNAL(triggered()),this,SLOT(save()));

        saveAsActs.append(act);
    }

    printAct = new QAction(tr("&Print..."),this);
    connect(printAct,SIGNAL(triggered()),scribbleArea,SLOT(print()));

    exitAct = new QAction(tr("E&xit"),this);
    exitAct->setShortcuts(QKeySequence::Quit);
    connect(exitAct,SIGNAL(triggered()),this,SLOT(close()));

    penColorAct = new QAction(tr("&Pen Color..."),this);
    connect(penColorAct,SIGNAL(triggered()),this,SLOT(penColor()));

    penWidthAct = new QAction(tr("Pen &Width..."),this);
    connect(penWidthAct,SIGNAL(triggered()),this,SLOT(penWidth()));

    clearScreenAct = new QAction(tr("&Clear Screen"),this);
    clearScreenAct->setShortcut(tr("Ctrl + L"));
    connect(clearScreenAct,SIGNAL(triggered()),scribbleArea,SLOT(clearImage()));

    aboutAct = new QAction(tr("&About"),this);
    connect(aboutAct,SIGNAL(triggered()),this,SLOT(about()));

    aboutQtAct = new QAction(tr("About &Qt"),this);
    connect(aboutQtAct,SIGNAL(triggered()),qApp,SLOT(aboutQt()));

    //connect(scribbleArea,SIGNAL(DebugText(QPoint)),this,SLOT(showMousePos(QPoint)));

    connect(scribbleArea,SIGNAL(DebugText(QPoint)),this,SLOT(showMousePos()));
    connect(scribbleArea,SIGNAL(DebugText(QPoint)),this,SLOT(showMousePos(QPoint)));
}

void MainWindow::createMenus()
{
    saveAsMenu = new QMenu(tr("&Save As"),this);
    foreach(QAction *act,saveAsActs)
    {
        saveAsMenu->addAction(act);
    }


    fileMenu = new QMenu(tr("&File(文件)"), this);
    fileMenu->addAction(openAct);
    fileMenu->addMenu(saveAsMenu);
    fileMenu->addAction(printAct);
    fileMenu->addSeparator();
    fileMenu->addAction(exitAct);

    optionMenu = new QMenu(tr("&Options"),this);
    optionMenu->addAction(penColorAct);
    optionMenu->addAction(penWidthAct);
    optionMenu->addSeparator();
    optionMenu->addAction(clearScreenAct);

    helpMenu = new QMenu(tr("&Help"),this);
    helpMenu->addAction(aboutAct);
    helpMenu->addAction(aboutQtAct);

    menuBar()->addMenu(fileMenu);
    menuBar()->addMenu(optionMenu);
    menuBar()->addMenu(helpMenu);
}

bool MainWindow::maybeSave()
{
    if(scribbleArea->isModified())
    {
        QMessageBox::StandardButton ret;

        ret = QMessageBox::warning(this,tr("Scribble"),tr("The image has been modified.\n" "Do you wang to save your changes?"),QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);

        if(ret == QMessageBox::Save)
        {
            return saveFile("png");
        }else if (ret == QMessageBox::Cancel) {

            return false;
        }
    }
    return true;
}

bool MainWindow::saveFile(const QByteArray &fileFormat)
{
    QString initialPath = QDir::currentPath() + "/untitled." + fileFormat;

    QString fileName = QFileDialog::getSaveFileName(this,
                                                    tr("Save As"),
                                                    initialPath,
                                                    tr("%1 Files (*.%2);;All Files (*)").arg(QString::fromLatin1(fileFormat.toUpper())).arg(QString::fromLatin1(fileFormat)));

    if(fileName.isEmpty())
    {
        return false;
    }else{
        return scribbleArea->saveImage(fileName,fileFormat.constData());
    }
}
